home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlb20 / lib / bcopy.cpp < prev    next >
C/C++ Source or Header  |  1992-05-17  |  5KB  |  223 lines

  1. #include <compiler.h>
  2.  
  3. |    new version of bcopy, memcpy and memmove
  4. |    handles overlap, odd/even alignment
  5. |    uses movem to copy 256 bytes blocks faster.
  6. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  7. |    sortof inspired by jrbs bcopy
  8.  
  9.     .text
  10.     .even
  11.     .globl _bcopy
  12. #ifdef __MINT__
  13.     .globl    __bcopy
  14. #else
  15.     .globl _lbcopy
  16. #endif
  17.     .globl _memcpy
  18.     .globl _memmove
  19.  
  20. |    void *memcpy( void *dest, const void *src, size_t len );
  21. |    void *memmove( void *dest, const void *src, size_t len );
  22. |    returns dest
  23. |    functions are aliased
  24.  
  25. _memcpy:
  26. _memmove:
  27.     movl    sp@(4),a1    | dest
  28.     movl    sp@(8),a0    | src
  29.     jra    common        | the rest is samea as bcopy
  30.  
  31. |    void bcopy( const void *src, void *dest, size_t length );
  32. |    void lbcopy( const void *src, void *dest, size_t length );
  33. |    return value not used (returns src)
  34. |    functions are aliased
  35.  
  36. _bcopy:
  37. #ifdef __MINT__
  38. __bcopy:
  39. #else
  40. _lbcopy:
  41. #endif
  42.     movl    sp@(4),a0    | src
  43.     movl    sp@(8),a1    | dest
  44. common:    movl    sp@(12),d0    | length
  45.     jeq    exit        | length==0? (size_t)
  46.  
  47.                 | a0 src, a1 dest, d0.l length
  48.     movel    d2,sp@-
  49.  
  50.     | overlay ?
  51.     cmpl    a0,a1
  52.     jgt    top_down
  53.  
  54.     movw    a0,d1        | test for alignment
  55.     movw    a1,d2
  56.     eorw    d2,d1
  57.     btst    #0,d1        | one odd one even ?
  58.     jne    slow_copy
  59.     btst    #0,d2        | both even ?
  60.     jeq    both_even
  61.     movb    a0@+,a1@+    | copy one byte, now we are both even
  62.     subql    #1,d0
  63. both_even:
  64.     clrw    d1        | save length less 256
  65.     movb    d0,d1
  66.     lsrl    #8,d0        | number of 256 bytes blocks
  67.     jeq    less256
  68.     movml    d3-d7/a2-a6,sp@-    | d2 is already saved
  69. copy256:
  70.     movml    a0@+,d2-d7/a2-a6    | copy 5*44+36=256 bytes
  71.     movml    d2-d7/a2-a6,a1@
  72.     movml    a0@+,d2-d7/a2-a6
  73.     movml    d2-d7/a2-a6,a1@(44)
  74.     movml    a0@+,d2-d7/a2-a6
  75.     movml    d2-d7/a2-a6,a1@(88)
  76.     movml    a0@+,d2-d7/a2-a6
  77.     movml    d2-d7/a2-a6,a1@(132)
  78.     movml    a0@+,d2-d7/a2-a6
  79.     movml    d2-d7/a2-a6,a1@(176)
  80.     movml    a0@+,d2-d7/a2-a4
  81.     movml    d2-d7/a2-a4,a1@(220)
  82.     lea    a1@(256),a1        | increment dest, src is already
  83.     subql    #1,d0
  84.     jne    copy256         | next, please
  85.     movml    sp@+,d3-d7/a2-a6
  86. less256:            | copy 16 bytes blocks
  87.     movw    d1,d0
  88.     lsrw    #2,d0        | number of 4 bytes blocks
  89.     jeq    less4        | less that 4 bytes left
  90.     movw    d0,d2
  91.     negw    d2
  92.     andw    #3,d2        | d2 = number of bytes below 16 (-n)&3
  93.     subqw    #1,d0
  94.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d2==0
  95.     addw    d2,d2        | offset in code (movl two bytes)
  96.     jmp    pc@(2,d2:w)    | jmp into loop
  97. copy16:
  98.     movl    a0@+,a1@+
  99.     movl    a0@+,a1@+
  100.     movl    a0@+,a1@+
  101.     movl    a0@+,a1@+
  102.     dbra    d0,copy16
  103. less4:
  104.     btst    #1,d1
  105.     jeq    less2
  106.     movw    a0@+,a1@+
  107. less2:
  108.     btst    #0,d1
  109.     jeq    none
  110.     movb    a0@,a1@
  111. none:
  112. exit_d2:
  113.     movl    sp@+,d2
  114. exit:
  115.     movl sp@(4),d0        | return dest (for memcpy only)
  116.     rts
  117.  
  118. slow_copy:            | byte by bytes copy
  119.     movw    d0,d1
  120.     negw    d1
  121.     andw    #7,d1        | d1 = number of bytes blow 8 (-n)&7
  122.     addql    #7,d0
  123.     lsrl    #3,d0        | number of 8 bytes block plus 1, if d1!=0
  124.     addw    d1,d1        | offset in code (movb two bytes)
  125.     jmp    pc@(2,d1:w)    | jump into loop
  126. scopy:
  127.     movb    a0@+,a1@+
  128.     movb    a0@+,a1@+
  129.     movb    a0@+,a1@+
  130.     movb    a0@+,a1@+
  131.     movb    a0@+,a1@+
  132.     movb    a0@+,a1@+
  133.     movb    a0@+,a1@+
  134.     movb    a0@+,a1@+
  135.     subql    #1,d0
  136.     jne    scopy
  137.     jra    exit_d2
  138.  
  139. top_down:
  140.     addl    d0,a0        | a0 byte after end of src
  141.     addl    d0,a1        | a1 byte after end of dest
  142.  
  143.     movw    a0,d1        | exact the same as above, only with predec
  144.     movw    a1,d2
  145.     eorw    d2,d1
  146.     btst    #0,d1
  147.     jne    slow_copy_d
  148.  
  149.     btst    #0,d2
  150.     jeq    both_even_d
  151.     movb    a0@-,a1@-
  152.     subql    #1,d0
  153. both_even_d:
  154.     clrw    d1
  155.     movb    d0,d1
  156.     lsrl    #8,d0
  157.     jeq    less256_d
  158.     movml    d3-d7/a2-a6,sp@-
  159. copy256_d:
  160.     movml    a0@(-44),d2-d7/a2-a6
  161.     movml    d2-d7/a2-a6,a1@-
  162.     movml    a0@(-88),d2-d7/a2-a6
  163.     movml    d2-d7/a2-a6,a1@-
  164.     movml    a0@(-132),d2-d7/a2-a6
  165.     movml    d2-d7/a2-a6,a1@-
  166.     movml    a0@(-176),d2-d7/a2-a6
  167.     movml    d2-d7/a2-a6,a1@-
  168.     movml    a0@(-220),d2-d7/a2-a6
  169.     movml    d2-d7/a2-a6,a1@-
  170.     movml    a0@(-256),d2-d7/a2-a4
  171.     movml    d2-d7/a2-a4,a1@-
  172.     lea    a0@(-256),a0
  173.     subql    #1,d0
  174.     jne    copy256_d
  175.     movml    sp@+,d3-d7/a2-a6
  176. less256_d:
  177.     movw    d1,d0
  178.     lsrw    #2,d0
  179.     jeq    less4_d
  180.     movw    d0,d2
  181.     negw    d2
  182.     andw    #3,d2
  183.     subqw    #1,d0
  184.     lsrw    #2,d0
  185.     addw    d2,d2
  186.     jmp    pc@(2,d2:w)
  187. copy16_d:
  188.     movl    a0@-,a1@-
  189.     movl    a0@-,a1@-
  190.     movl    a0@-,a1@-
  191.     movl    a0@-,a1@-
  192.     dbra    d0,copy16_d
  193. less4_d:
  194.     btst    #1,d1
  195.     jeq    less2_d
  196.     movw    a0@-,a1@-
  197. less2_d:
  198.     btst    #0,d1
  199.     jeq    exit_d2
  200.     movb    a0@-,a1@-
  201.     jra    exit_d2
  202. slow_copy_d:
  203.     movw    d0,d1
  204.     negw    d1
  205.     andw    #7,d1
  206.     addql    #7,d0
  207.     lsrl    #3,d0
  208.     addw    d1,d1
  209.     jmp    pc@(2,d1:w)
  210. scopy_d:
  211.     movb    a0@-,a1@-
  212.     movb    a0@-,a1@-
  213.     movb    a0@-,a1@-
  214.     movb    a0@-,a1@-
  215.     movb    a0@-,a1@-
  216.     movb    a0@-,a1@-
  217.     movb    a0@-,a1@-
  218.     movb    a0@-,a1@-
  219.     subql    #1,d0
  220.     jne    scopy_d
  221.     jra    exit_d2
  222.  
  223.